package com.qdlc.p2p.biz.log.score.login;

import com.qdlc.p2p.biz.log.score.BaseTenderScoreLog;
import com.qdlc.p2p.common.constant.Global;
import com.qdlc.p2p.common.constant.ScoreTemplateConstant;
import com.qdlc.p2p.common.exception.ScoreException;
import com.qdlc.p2p.dal.checkrule.ScoreUserLoginRuleCheck;
import com.qdlc.p2p.dal.common.RuleCheckHelper;
import com.qdlc.p2p.dal.dto.ScoreLog;
import com.qdlc.p2p.dal.dto.ScoreType;

/**
 * 用户每日登录获取积分
 */
public class LoginScoreLog extends BaseTenderScoreLog {

	private static final long serialVersionUID = 1L;
	
	private String logTemplateNid = ScoreTemplateConstant.SCORE_USER_LOGIN;

	public LoginScoreLog() {
		super();
	}

	public LoginScoreLog(long userId) {
		super(userId, 0, ScoreTemplateConstant.SCORE_USER_LOGIN);
		int score = getScoreValue(userId);
		this.setScore(score);
		Global.setTransfer("score", score);
		this.setLogTemplateNid(logTemplateNid);
	}

	@Override
	public void doEvent() {
		ScoreLog scoreLog = this.scoreLogDao.findDaily(getUser().getUserId());
		if (scoreLog == null) {// 查找今天是否已有，如果有，就不进行再次添加积分了
			super.doEvent();
		}
	}

	/**
	 * 计算登录所获积分
	 * @param userId
	 * @return
	 */
	public int getScoreValue(long userId) {
		ScoreType type = scoreTypeDao.getScoreTypeByNid(ScoreTemplateConstant.SCORE_USER_LOGIN);
		if (type == null || type.getStatus() == ScoreTemplateConstant.SCORE_TYPE_DISABLE) {
			return 0;
		}
		ScoreUserLoginRuleCheck rule = RuleCheckHelper.getValue(ScoreUserLoginRuleCheck.class);
		if(!rule.checkRule()){
			return 0; 
		}
		ScoreLog scoreLog = scoreLogDao.findDaily(userId);// 查找今天是否已有，如果有，就不进行再次添加积分了
		int todayChangeScore = 0;// 今日应该变化的值
		if (scoreLog == null) {
			ScoreLog beforeScoreLog = scoreLogDao.findBeforeLog(userId, logTemplateNid);// 获取前一日是否存在登录积分奖励
			if (beforeScoreLog == null) {// 为空表示昨天没有登录
				todayChangeScore = rule.daily_start;// 今日获取初始积分
			} else {// 不为空表示昨天登录过
				int bChangeScore = beforeScoreLog.getScore();// 得到上一日登录变化的分数值
				// 今日获取积分 如果前一日已经等于日获取最大值，那么此次增加只能最大值，否则可以在前一日基础上增加连续每日分数
				if (bChangeScore == rule.daily_max) { // 若前一日已经为最大值
					todayChangeScore = rule.daily_max;
				} else {
					todayChangeScore = bChangeScore + rule.daily_add;
				}
			}
		}
		return todayChangeScore;
	}

	@Override
	public void modifyScore() {
		Boolean result = scoreDao.updateScore(this.getUser().getUserId(), this.getScore(), this.getScore(), 0, 0);
        if(!result){
        	throw new ScoreException("更新用户积分失败！", 1);
        }
	}
}
